#include <linux/init.h>//包含宏定义得头文件
#include <linux/module.h>//包含初始化加载模块得头文件
#include <linux/platform_device.h> //platform总线中的device设备描述头文件
/*包含头文件*/

/*****************platfrom平台总线模型platform_device设备文件编写*****************
*注册device，device是描述硬件资源的文件，含寄存器地址，中断号时钟等，linux中提供了结构
platfrom_device结构体来描述
*(1)填充platform结构体
*(2)对硬件资源描述结构体struct resource进行填充后填写到platform_device结构体中
*(3)申明信息
*(4)功能实现
回顾static关键字：可用于全局变量，局部变量，以及函数中，变量中是默认
是static与extern相反，函数则相反，用于局部变量则会使得变量自动初始化
为0，并且当函数释放栈空间时候，该变量并不会随之释放内存
*************************************************************/
/*全局变量*/
struct resource beep_res[]={   //用于描述寄存器的结构体数组，如果需要修改多组寄存器以此往下推
   [0]={
       .start= 0x20AC000,
       .end  = 0x20AC003,
       .flags=IORESOURCE_MUN,
       .name ="GPIO5_DR"
   }

};
void beep_release(struct device *dev)
{
    printk("byb byb platform_device!\n");
}

struct platform_device beep_device={ //完成platform_device的相关数据填充
    .name ="beep_test",              //在/sys/device下可以查看到
    .id =-1,
    .resource=beep_res,
    .num_resources = ARRAY_SIZE(beep_res),
    .dev={
        .release = beep_release
    }
};


static int device_init(void)
{
    printk("hello world\n");
    return platform_device_register(&beep_device);
}

static void device_exit(void)//退出函数没有返回值
{
    printk("byd byd !\n");
    platform_device_unregister(&beep_device);
}
/*功能实现*/

module_init(device_init);
module_exit(device_exit);
/*驱动的出口与入口函数都在此处*/
MODULE_LICENSE("GPL");
/*申明信息*/
